Introduction

David, Please see the link below for the paper on Single-Cell retinal sequencing paper. We can ask the following questions. Whether Nlz2 present one or more clusters? Whether Nlz2 present in Amacrine or ganglion cell clusters? If present, what other transcriptional factors present in those clusters?

http://www.sciencedirect.com/science/article/pii/S0092867415005498

There is another paper on Single-cell sequencing done on Bipolar cell. See the link below. http://www.sciencedirect.com/science/article/pii/S0092867416310078

Thanks for your help.

Elan

Visualization of single cell expression, clustered by t-SNE

Seurat was used for analysis.

Briefly, the raw counts (P14 mouse retina) data from the Macosko and McCarroll paper were loaded into Seurat and, for visualization purposes, only the 12934 cells with 900 or more genes expressed in them were used for initial clustering and visualization. This cut-off was used as the majority of the cells have very little detected gene expression and the clustering was not performing well.

My clustering results

library(cowplot)
library(Seurat)
library(tidyverse)
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
package ‘tibble’ was built under R version 3.4.1package ‘tidyr’ was built under R version 3.4.1package ‘purrr’ was built under R version 3.4.1package ‘dplyr’ was built under R version 3.4.1Conflicts with tidy packages -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
accumulate(): purrr, foreach
combine():    dplyr, Biobase, BiocGenerics
expand():     tidyr, Matrix
filter():     dplyr, stats
ggsave():     ggplot2, cowplot
lag():        dplyr, stats
lift():       purrr, caret
Position():   ggplot2, BiocGenerics, base
when():       purrr, foreach
library(here)
# load processed data from scripts/process_macosko.R
load(here('data/retina_seurat_subSet.Rdata'))
# Choose gene outliers on mean-variability plot
#retina <- FindVariableGenes(object = retina, x.low.cutoff = 0, y.cutoff = 2)
#length(x = retina@var.genes)
# elbow at 30
#PCElbowPlot(object = retina, num.pc = 40)
#PrintPCA(object = retina, pcs.print = 1:36)
#PCHeatmap(object = retina, pc.use = 1:12,100)
#PCHeatmap(object = retina, pc.use = 13:24,100)
#PCHeatmap(object = retina, pc.use = 25:36,100)
#VizPCA(object = retina, pcs.use = 1:2)
TSNEPlot(object = retina, do.label = TRUE)

As Macosko et al. have done the difficult work of classifying the cell types already, I will be using their cell classifications from now on.

Macosko Cluster and Cell Type Table/Key

To make sure that my clustering approximately matches the Macosko assignments, I have replotted the t-SNE plot from above, this time with the Macosko cell group assignments. They look pretty good, so it seems reasonable to use them.

Cell clustering with Macosko et al. assignments

# remove cells that Macosko did not classify
notNA <- retina@meta.data[!is.na(retina@meta.data$Macosko_Clusters),] %>% rownames()
retina_s <- SubsetData(retina, cells.use = notNA)
#print with macosko clustering
TSNEPlot(object = retina_s, do.label = TRUE, group.by = 'Macosko_Clusters')

Plot retina marker genes and ZFP503.

I can add any other genes you would like to see.

Two points:

  1. Not that many ZFP503 cells
  2. Many of them are in cluster 9 (top), which is an Amacrine population
# plot individual genes
FeaturePlot(object = retina, features.plot = c("PAX6", "VSX2", "OPN1MW", "RLBP1","NRL","SLC17A6","CRX","ZFP503"), 
            pt.size = 0.1,
            cols.use = c("gray", 
                         "blue"))

Number of cells with detectable ZFP503 Expression.

828 cells out of 44098 have detectable ZFP503 expression. Not many. This doesn’t seem to be a very highly expressed gene. This is corroborated by looking at ZNF503 expression in eyeIntegration

table(retina_superset@data['ZFP503',] > 0.1)

FALSE  TRUE 
43270   828 

Expression of key retinal markers in ZFP503 positive cells

Macosko Clustering cell type assignments for ZFP503

Amacrine enrichment. Also in the rods, but at a lower proportion than you would expect by chance.

Differential Expression

Find differentially expressed genes in ZFP503 positive cells relative to non-ZFP503 expressing cells. pct.1 is the percentage of ZFP503+ cells that the gene is expressed in. pct.2 are the ZFP503- cells. The p_val is calculated off of the avg_diff stat, which measures the strength of expression. So you will see genes that don’t have a large difference in percentage of cells expression (pct.1 and pct.1), but have a very low p_val. A positive avg_diff means that the gene is more highly expressed in the ZFP503+ cells.

SessionInfo

sessionInfo()
R version 3.4.0 (2017-04-21)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: OS X El Capitan 10.11.6

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] bindrcpp_0.2        dplyr_0.7.3         purrr_0.2.3         readr_1.1.1         tidyr_0.7.1         tibble_1.3.4        tidyverse_1.1.1     Seurat_2.0.1        Biobase_2.36.2      BiocGenerics_0.22.0 Matrix_1.2-11      
[12] cowplot_0.8.0       doMC_1.3.4          iterators_1.0.8     foreach_1.4.3       caret_6.0-77        ggplot2_2.2.1       lattice_0.20-35     here_0.1           

loaded via a namespace (and not attached):
  [1] readxl_1.0.0         backports_1.1.0      Hmisc_4.0-3          VGAM_1.0-4           NMF_0.20.6           sn_1.5-0             plyr_1.8.4           igraph_1.1.2         lazyeval_0.2.0       splines_3.4.0       
 [11] gridBase_0.4-7       digest_0.6.12        htmltools_0.3.6      lars_1.2             gdata_2.18.0         magrittr_1.5         checkmate_1.8.3      cluster_2.0.6        doParallel_1.0.10    mixtools_1.1.0      
 [21] ROCR_1.0-7           recipes_0.1.0        modelr_0.1.1         gower_0.1.2          dimRed_0.1.0         R.utils_2.5.0        colorspace_1.3-2     rvest_0.3.2          haven_1.1.0          jsonlite_1.5        
 [31] lme4_1.1-13          bindr_0.1            survival_2.41-3      ape_4.1              glue_1.1.1           DRR_0.0.2            registry_0.3         gtable_0.2.0         ipred_0.9-6          MatrixModels_0.4-1  
 [41] kernlab_0.9-25       ddalpha_1.2.1        prabclus_2.2-6       DEoptimR_1.0-8       scales_0.5.0         mvtnorm_1.0-6        rngtools_1.2.4       Rcpp_0.12.12         dtw_1.18-1           xtable_1.8-2        
 [51] htmlTable_1.9        tclust_1.3-1         foreign_0.8-69       proxy_0.4-17         mclust_5.3           SDMTools_1.1-221     Formula_1.2-2        DT_0.2               tsne_0.1-3           stats4_3.4.0        
 [61] lava_1.5             prodlim_1.6.1        httr_1.3.1           htmlwidgets_0.9      FNN_1.1              gplots_3.0.1         RColorBrewer_1.1-2   fpc_2.1-10           acepack_1.4.1        modeltools_0.2-21   
 [71] ica_1.0-1            pkgconfig_2.0.1      R.methodsS3_1.7.1    flexmix_2.3-14       nnet_7.3-12          labeling_0.3         rlang_0.1.2          reshape2_1.4.2       cellranger_1.1.0     munsell_0.4.3       
 [81] tools_3.4.0          ranger_0.8.0         broom_0.4.2          evaluate_0.10.1      stringr_1.2.0        yaml_2.1.14          ModelMetrics_1.1.0   knitr_1.17           robustbase_0.92-7    caTools_1.17.1      
 [91] pbapply_1.3-3        nlme_3.1-131         R.oo_1.21.0          RcppRoll_0.2.2       xml2_1.1.1           compiler_3.4.0       e1071_1.6-8          ggjoy_0.3.0          stringi_1.1.5        forcats_0.2.0       
[101] trimcluster_0.1-2    psych_1.7.5          nloptr_1.0.4         diffusionMap_1.1-0   data.table_1.10.4    bitops_1.0-6         irlba_2.2.1          R6_2.2.2             latticeExtra_0.6-28  KernSmooth_2.23-15  
[111] gridExtra_2.2.1      codetools_0.2-15     MASS_7.3-47          gtools_3.5.0         assertthat_0.2.0     CVST_0.2-1           pkgmaker_0.22        rprojroot_1.2        withr_2.0.0          mnormt_1.5-5        
[121] hms_0.3              diptest_0.75-7       grid_3.4.0           rpart_4.1-11         timeDate_3012.100    minqa_1.2.4          class_7.3-14         rmarkdown_1.6        segmented_0.5-2.1    Rtsne_0.13          
[131] numDeriv_2016.8-1    scatterplot3d_0.3-40 lubridate_1.6.0      base64enc_0.1-3     
LS0tCnRpdGxlOiAiQW5hbHl6ZSBaRlA1MDMrIGNlbGxzIGZyb20gTWFjb3NrbyBldCBhbC4gc2luZ2xlIGNlbGwgbW91c2UgcmV0aW5hIGRhdGEiCmF1dGhvcjogRGF2aWQgTWNHYXVnaGV5CmRhdGU6IDIwMTctMDktMTMKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHR1ZnRlX1Jub3RlYm9vay5jc3MKLS0tCgojIEludHJvZHVjdGlvbgpEYXZpZCwKUGxlYXNlIHNlZSB0aGUgbGluayBiZWxvdyBmb3IgdGhlIHBhcGVyIG9uIFNpbmdsZS1DZWxsIHJldGluYWwgc2VxdWVuY2luZyBwYXBlci4gIFdlIGNhbiBhc2sgdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCldoZXRoZXIgTmx6MiBwcmVzZW50IG9uZSBvciBtb3JlIGNsdXN0ZXJzPwpXaGV0aGVyIE5sejIgcHJlc2VudCBpbiBBbWFjcmluZSBvciBnYW5nbGlvbiBjZWxsIGNsdXN0ZXJzPwpJZiBwcmVzZW50LCB3aGF0IG90aGVyIHRyYW5zY3JpcHRpb25hbCBmYWN0b3JzIHByZXNlbnQgaW4gdGhvc2UgY2x1c3RlcnM/CgpodHRwOi8vd3d3LnNjaWVuY2VkaXJlY3QuY29tL3NjaWVuY2UvYXJ0aWNsZS9waWkvUzAwOTI4Njc0MTUwMDU0OTgKClRoZXJlIGlzIGFub3RoZXIgcGFwZXIgb24gU2luZ2xlLWNlbGwgc2VxdWVuY2luZyBkb25lIG9uIEJpcG9sYXIgY2VsbC4gIFNlZSB0aGUgbGluayBiZWxvdy4KaHR0cDovL3d3dy5zY2llbmNlZGlyZWN0LmNvbS9zY2llbmNlL2FydGljbGUvcGlpL1MwMDkyODY3NDE2MzEwMDc4CgpUaGFua3MgZm9yIHlvdXIgaGVscC4KCkVsYW4KCgoKIyBWaXN1YWxpemF0aW9uIG9mIHNpbmdsZSBjZWxsIGV4cHJlc3Npb24sIGNsdXN0ZXJlZCBieSB0LVNORSAKU2V1cmF0IHdhcyB1c2VkIGZvciBhbmFseXNpcy4KCkJyaWVmbHksIHRoZSByYXcgY291bnRzIChQMTQgbW91c2UgcmV0aW5hKSBkYXRhIGZyb20gdGhlIE1hY29za28gYW5kIE1jQ2Fycm9sbCBwYXBlciB3ZXJlIGxvYWRlZCBpbnRvIFNldXJhdCBhbmQsIGZvciB2aXN1YWxpemF0aW9uIHB1cnBvc2VzLCBvbmx5IHRoZSBgciBuY29sKHJldGluYUBkYXRhKWAgY2VsbHMgd2l0aCA5MDAgb3IgbW9yZSBnZW5lcyBleHByZXNzZWQgaW4gdGhlbSB3ZXJlIHVzZWQgZm9yIGluaXRpYWwgY2x1c3RlcmluZyBhbmQgdmlzdWFsaXphdGlvbi4gVGhpcyBjdXQtb2ZmIHdhcyB1c2VkIGFzIHRoZSBtYWpvcml0eSBvZiB0aGUgY2VsbHMgaGF2ZSB2ZXJ5IGxpdHRsZSBkZXRlY3RlZCBnZW5lIGV4cHJlc3Npb24gYW5kIHRoZSBjbHVzdGVyaW5nIHdhcyBub3QgcGVyZm9ybWluZyB3ZWxsLiAKCk15IGNsdXN0ZXJpbmcgcmVzdWx0cwpgYGB7cn0KbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaGVyZSkKIyBsb2FkIHByb2Nlc3NlZCBkYXRhIGZyb20gc2NyaXB0cy9wcm9jZXNzX21hY29za28uUgpsb2FkKGhlcmUoJ2RhdGEvcmV0aW5hX3NldXJhdF9zdWJTZXQuUmRhdGEnKSkKIyBDaG9vc2UgZ2VuZSBvdXRsaWVycyBvbiBtZWFuLXZhcmlhYmlsaXR5IHBsb3QKI3JldGluYSA8LSBGaW5kVmFyaWFibGVHZW5lcyhvYmplY3QgPSByZXRpbmEsIHgubG93LmN1dG9mZiA9IDAsIHkuY3V0b2ZmID0gMikKI2xlbmd0aCh4ID0gcmV0aW5hQHZhci5nZW5lcykKCiMgZWxib3cgYXQgMzAKI1BDRWxib3dQbG90KG9iamVjdCA9IHJldGluYSwgbnVtLnBjID0gNDApCiNQcmludFBDQShvYmplY3QgPSByZXRpbmEsIHBjcy5wcmludCA9IDE6MzYpCiNQQ0hlYXRtYXAob2JqZWN0ID0gcmV0aW5hLCBwYy51c2UgPSAxOjEyLDEwMCkKI1BDSGVhdG1hcChvYmplY3QgPSByZXRpbmEsIHBjLnVzZSA9IDEzOjI0LDEwMCkKI1BDSGVhdG1hcChvYmplY3QgPSByZXRpbmEsIHBjLnVzZSA9IDI1OjM2LDEwMCkKCiNWaXpQQ0Eob2JqZWN0ID0gcmV0aW5hLCBwY3MudXNlID0gMToyKQoKVFNORVBsb3Qob2JqZWN0ID0gcmV0aW5hLCBkby5sYWJlbCA9IFRSVUUpCmBgYAoKQXMgTWFjb3NrbyBldCBhbC4gaGF2ZSBkb25lIHRoZSBkaWZmaWN1bHQgd29yayBvZiBjbGFzc2lmeWluZyB0aGUgY2VsbCB0eXBlcyBhbHJlYWR5LCBJIHdpbGwgYmUgdXNpbmcgdGhlaXIgY2VsbCBjbGFzc2lmaWNhdGlvbnMgZnJvbSBub3cgb24uIAoKIyBNYWNvc2tvIENsdXN0ZXIgYW5kIENlbGwgVHlwZSBUYWJsZS9LZXkKYGBge3J9CnNvdXJjZSgnc2NyaXB0cy9tYWNvc2tvX2NsdXN0ZXJfYXNzaWdubWVudHMuUicpCm1hY29za29fY2x1c3RlciAlPiUgZ3JvdXBfYnkoTWFjb3Nrb19DbHVzdGVycykgJT4lICBzdW1tYXJpc2UoYENlbGwgVHlwZWAgPSBwYXN0ZSh1bmlxdWUoYENlbGwgVHlwZWApLCBjb2xsYXBzZSA9ICcsJykpJT4lIGFycmFuZ2UoTWFjb3Nrb19DbHVzdGVycykgJT4lIERUOjpkYXRhdGFibGUob3B0aW9ucz1saXN0KHBhZ2VMZW5ndGggPSA0MCkpCmBgYAoKVG8gbWFrZSBzdXJlIHRoYXQgbXkgY2x1c3RlcmluZyBhcHByb3hpbWF0ZWx5IG1hdGNoZXMgdGhlIE1hY29za28gYXNzaWdubWVudHMsIEkgaGF2ZSByZXBsb3R0ZWQgdGhlIHQtU05FIHBsb3QgZnJvbSBhYm92ZSwgdGhpcyB0aW1lIHdpdGggdGhlIE1hY29za28gY2VsbCBncm91cCBhc3NpZ25tZW50cy4gVGhleSBsb29rIHByZXR0eSBnb29kLCBzbyBpdCBzZWVtcyByZWFzb25hYmxlIHRvIHVzZSB0aGVtLiAKCiMgQ2VsbCBjbHVzdGVyaW5nIHdpdGggIE1hY29za28gZXQgYWwuIGFzc2lnbm1lbnRzCmBgYHtyLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD00fQojIHJlbW92ZSBjZWxscyB0aGF0IE1hY29za28gZGlkIG5vdCBjbGFzc2lmeQpub3ROQSA8LSByZXRpbmFAbWV0YS5kYXRhWyFpcy5uYShyZXRpbmFAbWV0YS5kYXRhJE1hY29za29fQ2x1c3RlcnMpLF0gJT4lIHJvd25hbWVzKCkKcmV0aW5hX3MgPC0gU3Vic2V0RGF0YShyZXRpbmEsIGNlbGxzLnVzZSA9IG5vdE5BKQoKI3ByaW50IHdpdGggbWFjb3NrbyBjbHVzdGVyaW5nClRTTkVQbG90KG9iamVjdCA9IHJldGluYV9zLCBkby5sYWJlbCA9IFRSVUUsIGdyb3VwLmJ5ID0gJ01hY29za29fQ2x1c3RlcnMnKQpgYGAKCiMgUGxvdCByZXRpbmEgbWFya2VyIGdlbmVzIGFuZCBaRlA1MDMuIAoKSSBjYW4gYWRkIGFueSBvdGhlciBnZW5lcyB5b3Ugd291bGQgbGlrZSB0byBzZWUuIAoKVHdvIHBvaW50czoKCjEuIE5vdCB0aGF0IG1hbnkgWkZQNTAzIGNlbGxzCjIuIE1hbnkgb2YgdGhlbSBhcmUgaW4gY2x1c3RlciA5ICh0b3ApLCB3aGljaCBpcyBhbiBBbWFjcmluZSBwb3B1bGF0aW9uCmBgYHtyLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00fQojIHBsb3QgaW5kaXZpZHVhbCBnZW5lcwpGZWF0dXJlUGxvdChvYmplY3QgPSByZXRpbmEsIGZlYXR1cmVzLnBsb3QgPSBjKCJQQVg2IiwgIlZTWDIiLCAiT1BOMU1XIiwgIlJMQlAxIiwiTlJMIiwiU0xDMTdBNiIsIkNSWCIsIlpGUDUwMyIpLCAKICAgICAgICAgICAgcHQuc2l6ZSA9IDAuMSwKICAgICAgICAgICAgY29scy51c2UgPSBjKCJncmF5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmx1ZSIpKQpgYGAKCgoKIyBOdW1iZXIgb2YgY2VsbHMgd2l0aCBkZXRlY3RhYmxlIFpGUDUwMyBFeHByZXNzaW9uLiAKCmByIHRhYmxlKHJldGluYV9zdXBlcnNldEBkYXRhWydaRlA1MDMnLF0gPiAwLjEpWydUUlVFJ11gIGNlbGxzIG91dCBvZiBgciBuY29sKHJldGluYV9zdXBlcnNldEBkYXRhKWAgaGF2ZSBkZXRlY3RhYmxlIFpGUDUwMyBleHByZXNzaW9uLiBOb3QgbWFueS4gVGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgYSB2ZXJ5IGhpZ2hseSBleHByZXNzZWQgZ2VuZS4gVGhpcyBpcyBjb3Jyb2JvcmF0ZWQgYnkgbG9va2luZyBhdCBaTkY1MDMgZXhwcmVzc2lvbiBpbiBleWVJbnRlZ3JhdGlvbgoKIVtdKC4uL2RhdGEvVW5rbm93bi5wbmcpCgpgYGB7cn0KbG9hZChoZXJlKCdkYXRhL3JldGluYV9zZXVyYXRfc3VwZXJTZXQuUmRhdGEnKSkKCnRhYmxlKHJldGluYV9zdXBlcnNldEBkYXRhWydaRlA1MDMnLF0gPiAwLjEpCmBgYAoKIyBFeHByZXNzaW9uIG9mIGtleSByZXRpbmFsIG1hcmtlcnMgaW4gWkZQNTAzIHBvc2l0aXZlIGNlbGxzCmBgYHtyfQp6ZnA1MDNfcG9zX2NlbGxzIDwtIGNvbG5hbWVzKHJldGluYV9zdXBlcnNldEBkYXRhKVtyZXRpbmFfc3VwZXJzZXRAZGF0YVsnWkZQNTAzJyxdID4gMC4xXQp6ZnA1MDNfcG9zX2NlbGxzX1RGIDwtIHJldGluYV9zdXBlcnNldEBkYXRhWydaRlA1MDMnLF0gPiAwLjEKemZwNTAzX1NUUk9OR0xZcG9zX2NlbGxzIDwtIGNvbG5hbWVzKHJldGluYV9zdXBlcnNldEBkYXRhKVtyZXRpbmFfc3VwZXJzZXRAZGF0YVsnWkZQNTAzJyxdID4gMV0KCiNyZXRpbmFfc3VwZXJzZXRAZGF0YVtjKCJQT1U0RjEiLCAiQ0FMQjIiLCAiSVNMMSIsICJMSFgyIiwiUEFYNiIsICJWU1gyIiwgIk9QTjFNVyIsICJSTEJQMSIsIk5STCIsIlNMQzE3QTYiLCJDUlgiLCJaRlA1MDMiKSwgemZwNTAzX3Bvc19jZWxsc10gJT4lIGFzLm1hdHJpeCgpICU+JSBkYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbignR2VuZScpICU+JSBnYXRoZXIoJ2NlbGxfaWQnLCAnRXhwcmVzc2lvbicsIC1HZW5lKSAlPiUgZ2dwbG90KGFlcyh4PUdlbmUsIHk9RXhwcmVzc2lvbikpICsgZ2VvbV92aW9saW4oKSArIGdlb21faml0dGVyKGFscGhhPTAuMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwyMCkpCgpyZXRpbmFfc3VwZXJzZXRAZGF0YVtjKCJQT1U0RjEiLCAiQ0FMQjIiLCAiSVNMMSIsICJMSFgyIiwiUEFYNiIsICJWU1gyIiwgIk9QTjFNVyIsICJSTEJQMSIsIk5STCIsIlNMQzE3QTYiLCJDUlgiLCJaRlA1MDMiKSwgemZwNTAzX3Bvc19jZWxsc10gJT4lIGFzLm1hdHJpeCgpICU+JSBkYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbignR2VuZScpICU+JSBnYXRoZXIoJ2NlbGxfaWQnLCAnRXhwcmVzc2lvbicsIC1HZW5lKSAlPiUgZ2dwbG90KGFlcyh4PUdlbmUsIHk9RXhwcmVzc2lvbikpICsgZ2VvbV9ib3hwbG90KCkgKyBnZW9tX2ppdHRlcihhbHBoYT0wLjIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdD0wLjUpKSArIGNvb3JkX2NhcnRlc2lhbih5bGltPWMoMCwyMCkpCmBgYAoKIyBNYWNvc2tvIENsdXN0ZXJpbmcgY2VsbCB0eXBlIGFzc2lnbm1lbnRzIGZvciBaRlA1MDMKCkFtYWNyaW5lIGVucmljaG1lbnQuIEFsc28gaW4gdGhlIHJvZHMsIGJ1dCBhdCBhIGxvd2VyIHByb3BvcnRpb24gdGhhbiB5b3Ugd291bGQgZXhwZWN0IGJ5IGNoYW5jZS4gCmBgYHtyfQp6ZnA1MDNfY291bnRzIDwtIHJldGluYV9zdXBlcnNldEBtZXRhLmRhdGFbemZwNTAzX3Bvc19jZWxscywnQ2VsbCBUeXBlJ10gJT4lIHRhYmxlKCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgYXJyYW5nZSgtRnJlcSkgJT4lIG11dGF0ZShgWkZQNTAzIENvdW50YCA9IEZyZXEsIGBaRlA1MDMrIEZyZXFgPUZyZXEvbGVuZ3RoKHpmcDUwM19wb3NfY2VsbHMpKSAlPiUgc2VsZWN0KC1GcmVxKQphbGxfY291bnRzIDwtICByZXRpbmFfc3VwZXJzZXRAbWV0YS5kYXRhWywnQ2VsbCBUeXBlJ10gJT4lIHRhYmxlKCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgYXJyYW5nZSgtRnJlcSkgJT4lIG11dGF0ZShgQWxsIENvdW50c2AgPSBGcmVxLCBgQWxsIEZyZXFgPUZyZXEvbmNvbChyZXRpbmFfc3VwZXJzZXRAZGF0YSkpICU+JSBzZWxlY3QoLUZyZXEpCmxlZnRfam9pbih6ZnA1MDNfY291bnRzLCBhbGxfY291bnRzLCBieT1jKCcuJz0nLicpKSAlPiUgRFQ6OmRhdGF0YWJsZShvcHRpb25zPWxpc3QocGFnZUxlbmd0aD0yNSkpCgpgYGAKCiMgRGlmZmVyZW50aWFsIEV4cHJlc3Npb24KRmluZCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgaW4gWkZQNTAzIHBvc2l0aXZlIGNlbGxzIHJlbGF0aXZlIHRvIG5vbi1aRlA1MDMgZXhwcmVzc2luZyBjZWxscy4gcGN0LjEgaXMgdGhlIHBlcmNlbnRhZ2Ugb2YgWkZQNTAzKyBjZWxscyB0aGF0IHRoZSBnZW5lIGlzIGV4cHJlc3NlZCBpbi4gcGN0LjIgYXJlIHRoZSBaRlA1MDMtIGNlbGxzLiBUaGUgcF92YWwgaXMgY2FsY3VsYXRlZCBvZmYgb2YgdGhlIGF2Z19kaWZmIHN0YXQsIHdoaWNoIG1lYXN1cmVzIHRoZSBzdHJlbmd0aCBvZiBleHByZXNzaW9uLiBTbyB5b3Ugd2lsbCBzZWUgZ2VuZXMgdGhhdCBkb24ndCBoYXZlIGEgbGFyZ2UgZGlmZmVyZW5jZSBpbiBwZXJjZW50YWdlIG9mIGNlbGxzIGV4cHJlc3Npb24gKHBjdC4xIGFuZCBwY3QuMSksIGJ1dCBoYXZlIGEgdmVyeSBsb3cgcF92YWwuIEEgcG9zaXRpdmUgYXZnX2RpZmYgbWVhbnMgdGhhdCB0aGUgZ2VuZSBpcyBtb3JlIGhpZ2hseSBleHByZXNzZWQgaW4gdGhlIFpGUDUwMysgY2VsbHMuIApgYGB7cn0KcmV0aW5hX3pmcDUwMyA8LSByZXRpbmFfc3VwZXJzZXQKemZwNTAzX3RmIDwtIHJldGluYV9zdXBlcnNldEBkYXRhWydaRlA1MDMnLF0gPiAwLjEKemZwNTAzX3RmIDwtIGdzdWIoVFJVRSwgMSwgemZwNTAzX3RmKQp6ZnA1MDNfdGYgPC0gZ3N1YihGQUxTRSwgMCwgemZwNTAzX3RmKQpuYW1lcyh6ZnA1MDNfdGYpIDwtIG5hbWVzKHJldGluYV9zdXBlcnNldEBpZGVudCkKemZwNTAzX3RmIDwtIGFzLmZhY3Rvcih6ZnA1MDNfdGYpCnJldGluYV96ZnA1MDNAaWRlbnQgPC0gemZwNTAzX3RmCgp6ZnA1MDNfbWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSByZXRpbmFfemZwNTAzLCBpZGVudC4xID0gMSkKCnpmcDUwM19tYXJrZXJzICU+JSBEVDo6ZGF0YXRhYmxlKCkKCmBgYAoKIyBTZXNzaW9uSW5mbwpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK